﻿using System;

class Matrix
{
    private int[,] matrix; // поле на класа, използва се за описание състояните на обекта

    public Matrix(int rows, int cols)   //дефиниране на конструктор, който задава начално състояние на полетата
    {
        this.matrix = new int[rows, cols];
    }


    public int Rows     //дефинираме свойство(property) Rows - редовете в матрицата ни
    {
        get         //метод - връща стойността за полето, което търсиме
        {
            return this.matrix.GetLength(0); 
        }
    }
    
    public int Columns
    {
        get
        {
            return this.matrix.GetLength(1);
        }
    }

    public static Matrix operator + (Matrix first, Matrix second)       //предефиниране (overload) на оператор +(събиране)
    {
        Matrix result = new Matrix(first.Rows, first.Columns);

        for (int row = 0; row < first.Rows; row++)
        {
            for (int col = 0; col < first.Columns; col++)
            {
                result[row, col] = first[row, col] + second[row, col];
            }
        }
        return result;
    }

    public int this[int row, int col]             // предефиниране на индексатор на масив
    {
        get
        {
            return this.matrix[row, col];
        }
        set
        {
            this.matrix[row, col] = value;
        }
    }

    public override string ToString()           //инстанционен метод
    {
        string result = null;
        for (int row = 0; row < this.Rows; row++)    // this.Rows = this.matrix.GetLength(0)
        {
            for (int col = 0; col < this.Columns; col++)
            {
                result += matrix[row,col] + " ";
            }

            result += Environment.NewLine;      //  == \n , но така ще работи под Linux & Mac
        }
        return result;
    }
    
    public static Matrix operator -(Matrix first, Matrix second)       //предефиниране (overload) на оператор -(изваждане)
    {
        Matrix result = new Matrix(first.Rows, first.Columns);

        for (int row = 0; row < first.Rows; row++)
        {
            for (int col = 0; col < first.Columns; col++)
            {
                result[row, col] = first[row, col] - second[row, col];
            }
        }
        return result;
    }

    public static Matrix operator *(Matrix first, Matrix second)       //предефиниране (overload) на оператор *(умножение)
    {
        Matrix result = new Matrix(first.Rows, first.Columns);

        for (int row = 0; row < first.Rows; row++)
        {
            for (int col = 0; col < first.Columns; col++)
            {
                result[row, col] = first[row, col] * second[row, col];
            }
        }
        return result;
    }

}

